package com.flute.haflute.jobbox.base;

import java.io.Serializable;

/**
 * 非MapReduce任务执行需要进行的任务信息配置
 * 
 */

public class CloudJobConf implements JobConf {

	private static final long serialVersionUID = 1L;

	/**
	 * 资源调度器/资源分配器，负责指定输入来源，处理分配方式等
	 */
	private Class<? extends InputResource> inputResource;
	/**
	 * 子节点执行的具体任务类
	 */
	private Class<? extends CloudTask> taskRunner;
	/**
	 * 每个任务执行的环境参数
	 */
	private Serializable jobContext;
	/**
	 * RMI或者其他远程调用方式实现的在Master控制child的资源中心 将在master上实例化，并配置到各个子节点
	 */
	private Class<? extends CloudJobCenterController> centerController;
	/**
	 * 任务标识
	 */
	private String jobId;
	/**
	 * 执行该任务的集群节点数是否可扩展（动态增减）
	 */
	private boolean scalable = false;

	private int nTasks = -1;

	/**
	 * 任务描述
	 */
	private String jobDescription;

	/** 取得输入资源管理器 */
	public Class<? extends InputResource> getInputResource() {
		return inputResource;
	}

	/**
	 * 设置输入资源管理器
	 * 
	 * @param inputResource
	 *            负责指定输入来源，处理分配方式等
	 */
	public void setInputResource(Class<? extends InputResource> inputResource) {
		this.inputResource = inputResource;
	}

	/**
	 * 得到任务运行类
	 * 
	 * @return
	 */
	public Class<? extends CloudTask> getTaskRunner() {
		return taskRunner;
	}

	/**
	 * 设置任务运行类
	 * 
	 * @return
	 */
	public void setTaskRunner(Class<? extends CloudTask> runner) {
		this.taskRunner = runner;
	}

	/**
	 * 得到任务执行的环境参数
	 * 
	 * @return taskContext，在Master实例化，传入子节点
	 */
	public Serializable getJobContext() {
		return jobContext;
	}

	/**
	 * 设置任务执行的环境参数
	 * 
	 * @param jobContext
	 *            作业需要的配置环境等
	 */
	public void setJobContext(Serializable jobContext) {
		this.jobContext = jobContext;
	}

	/**
	 * RMI或者其他远程调用方式实现的在Master控制child执行的一种资源中心 将在master上实例化，并连接各个子节点
	 * 
	 * @return 任务控制中心
	 */
	public Class<? extends CloudJobCenterController> getCenterJobController() {
		return centerController;
	}

	/**
	 * 设置任务控制中心： RMI或者其他远程调用方式实现的在Master控制child执行的一种资源中心 将在master上实例化，并连接各个子节点
	 */
	public void setCenterJobController(
			Class<? extends CloudJobCenterController> controller) {
		this.centerController = controller;
	}

	@Override
	public String toString() {
		return "jobID=" + jobId + "_Runner=" + taskRunner.getSimpleName()
				+ "_Controller=" + centerController + "_InputSource="
				+ inputResource;
	}

	/*
	 * @see com.cpkf.yyjd.cloud.base.JobConf#getJobId()
	 */
	@Override
	public String getJobId() {
		return jobId;
	}

	/**
	 * 设置jobId，系统调度时设置，用户设置无效
	 */
	public void setJobId(String jobId) {
		this.jobId = jobId;
	}

	/**
	 * 设置该工作（Job）是否可扩展<br>
	 * true 可扩展，则新的节点加入时，如果工作仍然进行，则该节点也执行<br>
	 * false 不可扩展，仅运行于当前活动子节点上
	 */
	public void setScalable(boolean scalable) {
		this.scalable = scalable;
	}

	public boolean getScalable() {
		return scalable;
	}

	/**
	 * 指定该作业需要的节点数，默认按照集群任务策略进行分配
	 * 
	 * @param nTasks
	 */
	public void setTasksNeeded(int nTasks) {
		this.nTasks = nTasks;
	}

	public int getTasksNeeded() {
		return nTasks;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see com.cpkf.yyjd.cloud.base.JobConf#getJobDescription()
	 */
	public String getJobDescription() {
		return jobDescription;
	}

	public void setJobDescription(String jobDescription) {
		this.jobDescription = jobDescription;
	}
}
